﻿/*
 * ************************************
 * Archivo: frmCurp.cs
 *   Autor: I.S.C. Armando Rosales Maza
 *   Fecha: 26/07/2015
 **************************************
*/

#region Bibliotecas de clase.

using Critza.Bibliotecas;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Forms;

#endregion

namespace Critza.App
{
    public partial class frmCurp : Form
    {
        #region Variables y constantes.

        private Curp _curp;
        private const string _ERROR_CAMPO_VACIO = "El campo no puede quedar vacio.";
        private const string _ERROR_LONGITUD = "El cmpo no contiene la longitud necesaria.";
        private const string _ERROR_SELECCION = "Aun no ha seleccionado ningun elemento."; 
        private const string _ERROR_TIPO_DATO="La información ingresada es invalida";       

        public struct Sexo
        {
            public char Valor { get; set; }
            public string Descripcion { get; set; }
        }

        #endregion

        #region Constructor del formulario.

        /// <summary>
        /// Constructor del formulario.
        /// </summary>
        public frmCurp()
        {
            try
            {
                InitializeComponent();

                _curp = new Curp();
                InicializaCmbEstados();
                InicializaCmbSexos();
                txtNombre.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "!Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #endregion

        #region Método que llena el ComboBox de Sexo y selecciona el valor por default (SELECCIONAR…).

        /// <summary>
        /// Método que llena el ComboBox de Sexo y selecciona el valor por default (SELECCIONAR…).
        /// </summary>
        private void InicializaCmbSexos()
        {
            List<Sexo> _sexos = new List<Sexo>();
            _sexos.Add(new Sexo() { Valor = '0', Descripcion = "SELECCIONAR..." });
            _sexos.Add(new Sexo() { Valor = 'H', Descripcion = "HOMBRE" });
            _sexos.Add(new Sexo() { Valor = 'M', Descripcion = "MUJER" });

            cmbSexos.DataSource = _sexos;
            cmbSexos.ValueMember = "Valor";
            cmbSexos.DisplayMember = "Descripcion";
            cmbSexos.Refresh();
            cmbSexos.SelectedIndex = 0;
        }

        #endregion

        #region Método que llena el ComboBox de Estado de nacimiento y selecciona el valor por default (SELECCIONAR…).

        /// <summary>
        /// Método que llena el ComboBox de Estado de nacimiento y selecciona el valor por default (SELECCIONAR…).
        /// </summary>
        private void InicializaCmbEstados()
        {            
            cmbEstados.DataSource = _curp.estados;
            cmbEstados.ValueMember = "EstadoID";
            cmbEstados.DisplayMember = "Nombre";
            cmbEstados.Refresh();
            cmbEstados.SelectedIndex = 0;
        }

        #endregion

        #region Controladores de eventos para validar la información de los campos entrada y selección.

        /// <summary>
        /// Controlador de evento para validar la información ingresada en el campo de entrada txtNombre.
        /// </summary>
        /// <param name="sender">Control txtNombre.</param>
        /// <param name="e">Proporciona datos para cancelar el evento.</param>
        private void txtNombre_Validating(object sender, CancelEventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(txtNombre.Text) || string.IsNullOrWhiteSpace(txtNombre.Text))
                {
                    e.Cancel = true;
                    epErrores.SetError(txtNombre, _ERROR_CAMPO_VACIO);
                }
                else if (txtNombre.Text.Length < 2)
                {
                    e.Cancel = true;
                    epErrores.SetError(txtNombre, _ERROR_LONGITUD);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "!Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }       

        /// <summary>
        /// Controlador de evento para validar la información ingresada en el campo de entrada txtApellidoPaterno.
        /// </summary>
        /// <param name="sender">Control txtApellidoPaterno.</param>
        /// <param name="e">Proporciona datos para cancelar el evento.</param>
        private void txtApellidoPaterno_Validating(object sender, CancelEventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(txtApellidoPaterno.Text) || string.IsNullOrWhiteSpace(txtApellidoPaterno.Text))
                {
                    e.Cancel = true;
                    epErrores.SetError(txtApellidoPaterno, _ERROR_CAMPO_VACIO);
                }
                else if (txtApellidoPaterno.Text.Length < 2)
                {
                    e.Cancel = true;
                    epErrores.SetError(txtApellidoPaterno, _ERROR_LONGITUD);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "!Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Controlador de evento para validar que se haya seleccionado un elemento diferente al default en la lista cmbSexo.
        /// </summary>
        /// <param name="sender">Control cmbSexo.</param>
        /// <param name="e">Proporciona datos para cancelar el evento.</param>
        private void cmbSexos_Validating(object sender, CancelEventArgs e)
        {
            try
            {
                if (cmbSexos.SelectedIndex == 0)
                {
                    e.Cancel = true;
                    epErrores.SetError(cmbSexos, _ERROR_SELECCION);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "!Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Controlador de evento para validar la información ingresada en el campo de entrada mtxtFechaNacimiento.
        /// </summary>
        /// <param name="sender">Control mtxtFechaNacimiento.</param>
        /// <param name="e">Proporciona datos para cancelar el evento.</param>
        private void mtxtFechaNacimiento_Validating(object sender, CancelEventArgs e)
        {
            try
            {
                DateTime _fechaTemporal = DateTime.Now;

                if (string.IsNullOrEmpty(mtxtFechaNacimiento.Text) || string.IsNullOrWhiteSpace(mtxtFechaNacimiento.Text))
                {
                    e.Cancel = true;
                    epErrores.SetError(mtxtFechaNacimiento, _ERROR_CAMPO_VACIO);
                }

                if (mtxtFechaNacimiento.Text.Length.Equals(10) && DateTime.TryParse(mtxtFechaNacimiento.Text, out _fechaTemporal))
                    e.Cancel = false;
                else
                {
                    e.Cancel = true;
                    epErrores.SetError(mtxtFechaNacimiento, _ERROR_TIPO_DATO);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "!Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Controlador de evento para validar que se haya seleccionado un elemento diferente al default en la lista cmbEstados.
        /// </summary>
        /// <param name="sender">Control cmbEstados.</param>
        /// <param name="e">Proporciona datos para cancelar el evento.</param>
        private void cmbEstados_Validating(object sender, CancelEventArgs e)
        {
            try
            {
                if (cmbEstados.SelectedIndex == 0)
                {
                    e.Cancel = true;
                    epErrores.SetError(cmbEstados, _ERROR_SELECCION);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "!Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #endregion

        #region Controlador de evento que confirma que un control cumple con su validación de información de entrada.

        /// <summary>
        /// Controlador de evento que confirma que un control cumple con su validación de información de entrada.
        /// </summary>
        /// <param name="sender">Control que fue validado con éxito.</param>
        /// <param name="e">Evento de validación exitosa.</param>
        private void control_Validated(object sender, EventArgs e)
        {
            try
            {
                epErrores.SetError(this.Controls.Find(((sender) as Control).Name, true).First(), string.Empty);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "!Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #endregion

        #region Método que verifica que todos los campos de entrada y selección cumplan con todas las validaciones para poder obtener la CURP.

        /// <summary>
        /// Método que verifica que todos los campos de entrada y selección cumplan con todas las validaciones para poder obtener la CURP.
        /// </summary>
        /// <returns>True: Si cumplen todas las validaciones / False: No cumplen todas validaciones.</returns>
        private bool ValidaCampos()
        {
            try
            {

                bool _bandera = true;

                foreach (Control control in this.Controls)
                {
                    control.Focus();

                    if (!Validate())
                    {
                        DialogResult = DialogResult.None;
                        _bandera = false;
                        break;
                    }
                }

                _bandera = _curp.PuedeGenerarse(txtNombre.Text, txtApellidoPaterno.Text, txtApellidoMaterno.Text, cmbSexos.SelectedValue.ToString()[0], mtxtFechaNacimiento.Text, cmbEstados.SelectedValue.ToString());

                return _bandera;
            }
            catch (Exception)
            {
                return false;
            }
        }

        #endregion

        #region Controlador del evento Click para el control btnGenerar, el cual se encarga de obtener y mostrar el CURP en un mensaje emergente.

        /// <summary>
        /// Controlador del evento Click para el control btnGenerar, el cual se encarga de obtener y mostrar el CURP en un mensaje emergente.
        /// </summary>
        /// <param name="sender">Control btnGenerar.</param>
        /// <param name="e">Datos del evento Click.</param>
        private void btnGenerar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidaCampos())
                {
                    string _curpGenerado = _curp.ObtenCurp(txtNombre.Text, txtApellidoPaterno.Text, txtApellidoMaterno.Text, cmbSexos.SelectedValue.ToString()[0], mtxtFechaNacimiento.Text, cmbEstados.SelectedValue.ToString());
                    MessageBox.Show(string.Format("{0}\n[{1}]", "La Clave Única de Registro de Población (CURP) es:", _curpGenerado), "CURP generado exitosamente.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                    MessageBox.Show("Los campos de entrada y selección no cumplen con las validaciones para poder obtener el CURP.", "!Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "!Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #endregion

        #region Controlador del evento Click para el control btnLimpiar, el cual se encarga de limpiar los campos de entrada y seleccionar los valores por defecto en las listas de selección.

        /// <summary>
        /// Controlador del evento Click para el control btnLimpiar, el cual se encarga de limpiar los campos de entrada y seleccionar los valores por defecto en las listas de selección.
        /// </summary>
        /// <param name="sender">Control btnLimpiar.</param>
        /// <param name="e">Datos del evento Click.</param>
        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            try
            {
                txtNombre.Clear();
                txtApellidoPaterno.Clear();
                txtApellidoMaterno.Clear();
                cmbSexos.SelectedIndex = 0;
                mtxtFechaNacimiento.Clear();
                cmbEstados.SelectedIndex = 0;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "!Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #endregion

        #region Controlador de evento para salir de la aplicación.

        /// <summary>
        /// Controlador de evento para salir de la aplicación.
        /// </summary>
        /// <param name="sender">Control frmCurp</param>
        /// <param name="e">Información del evento de cierre del formulario.</param>
        private void frmCurp_FormClosing(object sender, FormClosingEventArgs e)
        {
            System.Environment.Exit(0);
        }

        #endregion
    }
}
